package com.antoco.controlcenter.utils;

import android.text.TextUtils;

import com.antoco.controlcenter.comm.message.RobotMessageBase;
import com.antoco.controlcenter.entity.DisplayEntity;
import com.antoco.controlcenter.entity.ParserEntity;
import com.antoco.controlcenter.entity.PropertyEntity;

import java.util.List;

public class PropertyUtils {

    //对属性值刷新
    public static void parserValue(RobotMessageBase message, List<PropertyEntity> entitys) {
        byte[] buffer = message.GetDataBuffer();
        entitys.forEach(entity -> {
            String propertyType = entity.getType();
            ParserEntity parserEntity = entity.getParserEntity();
            String parserType = TextUtils.isEmpty(parserEntity.getType()) ? "u32" : parserEntity.getType();
            long parserMask = TextUtils.isEmpty(parserEntity.getMask()) ? 0xFFFFFFFF : Long.parseLong(parserEntity.getMask().replaceAll("^0[x|X]", ""), 16);
            double parserAccuracy = TextUtils.isEmpty(parserEntity.getAccuracy()) ? 1 : Double.parseDouble(parserEntity.getAccuracy());
            double parserCorrect = TextUtils.isEmpty(parserEntity.getCorrect()) ? 0 : Double.parseDouble(parserEntity.getCorrect());
            int parserOffset = TextUtils.isEmpty(parserEntity.getOffset()) ? 0 : Integer.parseInt(parserEntity.getOffset());
            int parserLength = TextUtils.isEmpty(parserEntity.getLength()) ? 0 : Integer.parseInt(parserEntity.getLength());
            if (propertyType.equals("Number")) {
                if (parserLength > 4) return;

                long temp = 0;
                //大端
                for (int i = 0; i < parserLength; i++) {
                    temp <<= 8;
                    temp |= buffer[parserOffset + parserLength - 1 - i] & 0xFF;
                }
                //小端
//        for(int i=0;i<parserLength;i++){
//            value <<= 8;
//            value |= buffer[parserOffset+i]&0xFF;
//        }
                temp &= parserMask;
                double value;
                switch (parserType) {
                    case "s8":
                        value = (byte) temp;
                        break;
                    case "s16":
                        value = (short) temp;
                        break;
                    default:
                        value = temp;
                        break;
                }
                entity.setValue(String.valueOf(value * parserAccuracy + parserCorrect));
            }
        });


    }

    public static String getDisplay(PropertyEntity entity) {
        String propertyValue = entity.getValue();
        DisplayEntity displayEntity = entity.getDisplayEntity();
        if (null == displayEntity) {
            return "";
        }
        String displayTemplate = displayEntity.getTemplate();
        if (!TextUtils.isEmpty(propertyValue) && !TextUtils.isEmpty(displayTemplate)) {
            return String.format(displayTemplate, Double.parseDouble(propertyValue));
        }
        return "";
    }


    public static int getGearValue(List<PropertyEntity> entitys) {
        int robotGear = 0;
        for (PropertyEntity entity : entitys) {
            if (TextUtils.isEmpty(entity.getName())) {
                return robotGear;
            }
            if ("gear".equals(entity.getName())) {
                robotGear = Integer.parseInt(entity.getValue());
                return robotGear;
            }
        }
        return robotGear;
    }
}
